package controlador;

import java.net.InetAddress;
import java.net.UnknownHostException;
import modelo.servicios.InformacionBasica;
import modelo.servicios.Tanque;
import org.apache.log4j.Logger;

/**
 * Clase que se encarga de quemar el petróleo sobrante una vez el tanque actual se encuentre en su
 * capacidad máxima
 * @author Eduardo
 */
public class QuemaPetroleo extends Thread {

    private Tanque tanqueActual;
    private static boolean kill = false;
    private static Logger logger = Logger.getLogger(QuemaPetroleo.class);

    /**
     * Constructor de la clase
     * @param tanqueActual Tanque que quemará petróleo
     */
    public QuemaPetroleo(Tanque tanqueActual) {
        this.tanqueActual = tanqueActual;
        start();
    }

    @Override
    public void run() {
        Informacion i = new Informacion();
        InformacionBasica ib = i.obtenerInformacionBasica();

        while (!kill) {
            try {
                String ipLocal = InetAddress.getLocalHost().getHostAddress();
                String mensaje  = "Tanque " + ib.getIdTanque() + ": " + ipLocal + ", capacidad: " +
                        ib.getCapacidadTanque() + " litros, nivel actual: "
                        + i.consultarNivelActual().getLts() + " litros.";

                EnvioMensajes envioMensaje = new EnvioMensajes();
                if (!ib.getIpC().equals("localhost"))
                    envioMensaje.enviarMensajeColapsoCoordinador(mensaje);
            
                int nuevaCantidad = 0;

                logger.info("Quemando a razon de " + (ib.getCapacidadTanque() * 0.01) + " litros "
                        + "de petroleo por cada 20 segundos en el tanque " + ib.getIdTanque());
                System.out.println("Quemando a razon de " + (ib.getCapacidadTanque() * 0.01) +
                        " litros de petroleo por cada 20 segundos en el tanque "
                        + ib.getIdTanque());

                while ((i.consultarNivelActual().getLts() > (ib.getCapacidadTanque() * 0.50))
                        && (!kill)) {
                    System.out.println("Quemando " + (ib.getCapacidadTanque() * 0.01) + " litros "
                            + "del total de " + i.consultarNivelActual().getLts() + " litros "
                            + "existentes en el tanque " + ib.getIdTanque());

                    nuevaCantidad = (int) (i.consultarNivelActual().getLts() -
                            (ib.getCapacidadTanque() * 0.01));
                    getTanqueActual().setLts(nuevaCantidad);

                    i.actualizarNivel(getTanqueActual());

                    System.out.println("\nEl nivel de petróleo actual en el tanque " +
                            ib.getIdTanque() + " es de " + i.consultarNivelActual().getLts() +
                            " litros");

                    if ((getTanqueActual().getLts() < ib.getCapacidadTanque()) &&
                            (!ib.getIpC().equals("localhost")))
                        envioMensaje.enviarMensajeColapsoCoordinador("false");

                    System.out.println("Esperando 20 segundos");
                    QuemaPetroleo.sleep(20000);
                }

                kill = true;
                FlujoPetroleo.quemaPetroleo = false;
            } catch (InterruptedException ex) {
                logger.error("Ocurrio un error en la ejecucion del hilo");
                System.out.println("Ocurrió un error en la ejecución del hilo");
            } catch (UnknownHostException ex) {
                System.out.println("El equipo no tiene una dirección IP asignada");
            }
        }
    }

    /**
     * @return the tanqueActual Devuelve el tanque actual
     */
    public Tanque getTanqueActual() {
        return tanqueActual;
    }

    /**
     * @param tanqueActual the tanqueActual to set Asigna un valor al tanque actual
     */
    public void setTanqueActual(Tanque tanqueActual) {
        this.tanqueActual = tanqueActual;
    }

    /**
     * Termina la ejecución del hilo
     * @param kill Valor lógico que permite determinar cuándo un hilo será detenido
     */
    public void terminarEjecucion(boolean kill) {
        QuemaPetroleo.kill = kill;
    }
}
